package com.example.springbootcode.controller;

import com.example.springbootcode.util.CodeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.Duration;
import java.time.LocalTime;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
public class CoderController {

    @Autowired
    RedisTemplate redisTemplate;


/*
    // 生成验证码
    @PostMapping("/sendCode")
    public Map<String,Object> sendCodeServlet(String phone_no){

        // 生成验证码
        String code = CodeUtil.generateVerifyCode(4);

        // 将验证码存储到redis中,并设置过期时间
        String codeKey = phone_no + ":code";
        redisTemplate.opsForValue().set(codeKey, code,2, TimeUnit.MINUTES);

        Map<String, Object> map = new HashMap<>();
        map.put("success", true);
        return map;
    }
*/
// 生成验证码
@PostMapping("/sendCodeServlet")
public Map<String,Object> sendCodeServlet(String phone_no){
    Map<String, Object> map = new HashMap<>();
    // 记录发送验证码的次数
    String countKey = phone_no;
    Integer count = (Integer) redisTemplate.opsForValue().get(countKey);
    System.out.println(count);
    if (count == null) {
        // 证明是第一次发送，向Redis中设置一个计数器，默认值为1,有效时间为当日剩余的秒数
        long theLeftSeconds = getTheLeftSeconds();
        redisTemplate.opsForValue().set(countKey,1,(int)theLeftSeconds,TimeUnit.SECONDS);
    }else if(3 == count){
        map.put("count", false);
        return map;
    } else{
        redisTemplate.opsForValue().increment(countKey);
    }

    // 生成验证码
    String code = CodeUtil.generateVerifyCode(4);

    // 将验证码存储到redis中,并设置过期时间
    String codeKey = phone_no + ":code";
    redisTemplate.opsForValue().set(codeKey, code,2, TimeUnit.MINUTES);


    map.put("success", true);
    return map;
}
    //获取当天剩余秒数的方法
    private long getTheLeftSeconds(){
        //获取现在的时间
        LocalTime now = LocalTime.now();
        //获取当日23点59分59秒的时间
        LocalTime end = LocalTime.of(23, 59, 59);
        //获取end与now相差的秒数
        long millis = Duration.between(now, end).toMillis()/1000;
        return millis;
    }

    // 检验验证码
    @PostMapping("/checkCode")
    public Map<String,Object> checkCodeServlet(String phone_no,String verify_code){
        Map<String, Object> map = new HashMap<>();
        // 判断手机号和输入的验证码是否为空
        if (phone_no == null || verify_code == null || "".equals(phone_no)|| "".equals(verify_code)){
            map.put("success", false);
            return map;
        }
        // 获取redis中的验证码
        String codeKey = phone_no + ":code";
        String redisCode = (String) redisTemplate.opsForValue().get(codeKey);

        // 判断redis中的和输入的验证码是否一样
        if (redisCode.equals(verify_code)) {
            // 删除验证码
            redisTemplate.delete(codeKey);
            map.put("success", true);
            return map;
        }

        return map;
    }
}